<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Title</title>
  <script>
    //es5里面的类
    //1、最简单的类
    function Person(){
      this.name = '张三';
      this.age = 20;
    }
    var p = new Person();
    alert(p.name);

    //2、构造方法和原型链里面增加方法
    function Person(){
      this.name = '张三';//属性
      this.age = 20;

      this.run = function (){
        alert(this.name + '在运动');
      }
    }
    //原型链上的属性会被多个实例共享，构造函数不会
    Person.prototype.sex="男";
    Person.prototype.work = function () {
      alert(this.name + '在工作');
    }
    var p = new Person();
    alert(p.name);
    p.run();
    p.work();

    //3、类里面的静态方法
    function Person1(){
      this.name = '张三';//属性
      this.age = 20;

      this.run = function (){
        alert(this.name + '在运动');
      }
    }
    Person1.getInfo = function () {
      alert("我是静态方法");
    }
    //调用静态方法
    Person1.getInfo();

    //4、es5里面的继承
    function Person2(){
      this.name = '张三';//属性
      this.age = 20;
      this.run = function (){
        alert(this.name + '在运动');
      }
    }

    Person2.prototype.sex="男";
    Person2.prototype.work = function () {
      alert(this.name + '在工作');
    }

    //5、原型链+对象冒充的组合继承模式
    //web类  继承Person类 原型链+对象冒充的组合继承模式
    function Web(){
      Person.call(this);//对象冒充实现继承  实例化子类可以给父类传参
    }
    var w = new Web();
    w.run();//对象冒充可以继承构造函数里面的属性和方法
    //w.work();//但是没法继承原型链上面的属性和方法

    //6、原型链实现继承
    //Web1类  继承Person类  原型链实现继承
    function Web1(){

    }
    Web1.prototype = new Person();//原型链实现继承
    var w1 = new Web1();
    //原型链实现继承:可以继承构造函数里的属性和方法 也可以继承原型链上面的属性和方法
    w1.run();
    w1.work();

    //7、原型链实现继承的问题
    //实例化子类的时候没法给父类传参

    //8、原型链加构造函数的组合继承模式
    function Person(name,age){
      this.name = name;
      this.age = age;
      this.run = function (){
        alert(this.name + '在工作');
      }
    }

    function Web2(name,age){
      Person.call(this,name,age);//对象冒充继承 可以继承构造函数里面的属性和方法 实例化子类可以给父类传参
    }

    Web2.prototype = new Person();
    var w2 = new Web2("张三",20);
    w.run();
    w.work();

    //9、原型链+对象冒充继承的另一种方式
    //Web2.prototype = Person.prototype;

  </script>
</head>
<body>

</body>
</html>